import axios from "axios";
import { ElMessage } from "element-plus";
import router from '@/router'
import store from '@/store'


// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_URL, // 从环境变量获取基础地址
  timeout: 5000, // 请求超时时间
  headers: { "Content-Type": "application/json;charset=utf-8" }, // 请求头
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 如果碰到登录接口，直接放行，不需要验证token的存在
    if (config.url.includes('/login') || config.url.includes('/register')) {
      return config;
    }
    
    // 从 Vuex 获取 token
    const token = localStorage.getItem("access_token")  || store.getters.accessToken;
    if (token) {
      // 如果有token，则添加到请求头中
      config.headers.Authorization = `Bearer ${token}`;
    }else {
      ElMessage.error("请先登录");
      router.push('/login');
    }
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    ElMessage.error("请求错误");
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // 2xx 范围内的状态码都会触发该函数
    // 对响应数据做点什么
    const { status, data } = response;
    
    // 处理HTTP状态码
    if ( status !== 200 ) {
        ElMessage.error(`请求失败:${status}`);
        return Promise.reject(new Error(`请求失败: ${status}`));
    }

    // 假设后端统一响应格式为 { code, data, message }
    console.log('响应数据:', data);
    if (data.code !== 0) {
      // 业务错误处理
      ElMessage.error(data.message || '接口返回错误')
      return Promise.reject(new Error(data.message || '接口返回错误'))
    }

    // 只返回数据部分
    return data.data
  },
  (error) => {
    // 超出 2xx 范围的状态码都会触发该函数
    // 对响应错误做点什么
    
    // 检查是否有响应并且包含状态码
    if (error.response && error.response.status) {
      const { status, data } = error.response;
      
      // 处理特定的HTTP状态码
      switch (status) {
        case 400:
          ElMessage.error(data.message || '请求参数错误');
          break;
        case 401:
          ElMessage.error('未授权访问，请重新登录');
          // 可以在这里添加跳转到登录页的逻辑
          break;
        case 403:
          ElMessage.error('拒绝访问');
          break;
        case 404:
          ElMessage.error('请求资源不存在');
          break;
        case 500:
          ElMessage.error('服务器内部错误');
          break;
        default:
          ElMessage.error(`请求失败: ${status}`);
      }
      
      // 如果后端返回了统一格式的错误信息，则抛出业务错误
      if (data && data.message) {
        return Promise.reject(new Error(data.message));
      }
    } else {
      // 网络错误处理
      if (error.message.includes('timeout')) {
        ElMessage.error('请求超时，请稍后重试');
      } else if (error.message.includes('Network Error')) {
        ElMessage.error('网络错误，请检查网络连接');
      } else {
        ElMessage.error('未知错误，请稍后重试');
      }
    }
    
    return Promise.reject(error);
  }
)

// 关键：确保导出 service 实例
export default service